const mysql = require('mysql2/promise');
const fs = require('fs');
const path = require('path');

/**
 * MySQL数据库连接测试脚本 - 自动读取 .env 文件
 */

// 读取并解析 .env 文件
function loadEnvFile() {
  const envPath = path.join(__dirname, '.env');
  
  if (!fs.existsSync(envPath)) {
    console.log('⚠️  未找到 .env 文件，使用默认配置');
    return {};
  }

  const envContent = fs.readFileSync(envPath, 'utf-8');
  const envVars = {};

  envContent.split('\n').forEach(line => {
    // 跳过注释和空行
    line = line.trim();
    if (line && !line.startsWith('#')) {
      const [key, ...valueParts] = line.split('=');
      if (key && valueParts.length > 0) {
        envVars[key.trim()] = valueParts.join('=').trim();
      }
    }
  });

  return envVars;
}

async function testConnection() {
  console.log('========================================');
  console.log('🔍 MySQL 数据库连接测试 (使用 .env 配置)');
  console.log('========================================\n');

  // 读取 .env 文件
  const envVars = loadEnvFile();
  
  console.log('📄 从 .env 文件读取配置...\n');

  // 数据库配置
  const config = {
    host: envVars.DB_HOST || 'localhost',
    port: parseInt(envVars.DB_PORT) || 3306,
    user: envVars.DB_USERNAME || 'root',
    password: envVars.DB_PASSWORD || '',
    database: envVars.DB_DATABASE || 'test',
  };

  console.log('📋 连接配置:');
  console.log(`   主机: ${config.host}`);
  console.log(`   端口: ${config.port}`);
  console.log(`   用户: ${config.user}`);
  console.log(`   密码: ${config.password ? '***' + config.password.slice(-3) : '(未设置)'}`);
  console.log(`   数据库: ${config.database}`);
  console.log('');

  let connection;

  try {
    // 1. 测试连接
    console.log('🔄 步骤 1: 连接数据库...');
    connection = await mysql.createConnection(config);
    console.log('✅ 连接成功！\n');

    // 2. 查询当前连接信息
    console.log('🔄 步骤 2: 查询连接信息...');
    const [connInfo] = await connection.query('SELECT USER() as user, DATABASE() as db, VERSION() as version');
    console.log('✅ 连接信息:');
    console.log(`   当前用户: ${connInfo[0].user}`);
    console.log(`   当前数据库: ${connInfo[0].db}`);
    console.log(`   MySQL 版本: ${connInfo[0].version}`);
    console.log('');

    // 3. 查询数据库列表
    console.log('🔄 步骤 3: 查询数据库列表...');
    const [databases] = await connection.query('SHOW DATABASES');
    console.log(`✅ 可访问的数据库 (${databases.length} 个):`);
    databases.forEach(db => {
      const dbName = db.Database;
      const indicator = dbName === config.database ? ' ⭐ (当前)' : '';
      console.log(`   - ${dbName}${indicator}`);
    });
    console.log('');

    // 4. 查询表列表
    console.log('🔄 步骤 4: 查询数据库表...');
    const [tables] = await connection.query('SHOW TABLES');
    if (tables.length > 0) {
      console.log(`✅ 找到 ${tables.length} 个表:`);
      tables.forEach((table, index) => {
        const tableName = Object.values(table)[0];
        console.log(`   ${(index + 1).toString().padStart(2, ' ')}. ${tableName}`);
      });
      console.log('');

      // 5. 查询每个表的记录数
      console.log('🔄 步骤 5: 查询表记录数...');
      console.log('✅ 表记录统计:');
      for (const table of tables) {
        const tableName = Object.values(table)[0];
        try {
          const [countResult] = await connection.query(`SELECT COUNT(*) as count FROM ${tableName}`);
          const count = countResult[0].count;
          console.log(`   - ${tableName}: ${count} 条记录`);
        } catch (e) {
          console.log(`   - ${tableName}: 无法查询 (${e.message})`);
        }
      }
      console.log('');

      // 6. 显示第一个表的结构
      const firstTable = Object.values(tables[0])[0];
      console.log(`🔄 步骤 6: 查询表 "${firstTable}" 的结构...`);
      const [columns] = await connection.query(`DESCRIBE ${firstTable}`);
      console.log(`✅ 表结构 (${columns.length} 个字段):`);
      console.log('');
      console.log('   字段名'.padEnd(25) + ' 类型'.padEnd(20) + ' 空值 ' + ' 键  ' + ' 默认值');
      console.log('   ' + '-'.repeat(70));
      columns.forEach(col => {
        const field = col.Field.padEnd(25);
        const type = col.Type.padEnd(20);
        const nullable = (col.Null === 'YES' ? 'YES' : 'NO').padEnd(4);
        const key = (col.Key || '').padEnd(4);
        const defaultVal = col.Default || 'NULL';
        console.log(`   ${field} ${type} ${nullable} ${key} ${defaultVal}`);
      });
      console.log('');

    } else {
      console.log('⚠️  数据库中没有表');
      console.log('');
    }

    // 测试查询性能
    const stepNum = tables.length > 0 ? 7 : 5;
    console.log(`🔄 步骤 ${stepNum}: 测试查询性能...`);
    const times = [];
    for (let i = 0; i < 5; i++) {
      const startTime = Date.now();
      await connection.query('SELECT 1');
      const endTime = Date.now();
      times.push(endTime - startTime);
    }
    const avgTime = (times.reduce((a, b) => a + b, 0) / times.length).toFixed(2);
    const minTime = Math.min(...times);
    const maxTime = Math.max(...times);
    console.log(`✅ 查询性能 (5次测试):`);
    console.log(`   平均响应时间: ${avgTime}ms`);
    console.log(`   最快: ${minTime}ms, 最慢: ${maxTime}ms`);
    console.log('');

    // 查询服务器状态
    console.log(`🔄 步骤 ${stepNum + 1}: 查询服务器状态...`);
    const [status] = await connection.query(`
      SHOW STATUS WHERE Variable_name IN (
        'Threads_connected', 
        'Uptime', 
        'Questions',
        'Bytes_received',
        'Bytes_sent'
      )
    `);
    console.log('✅ 服务器状态:');
    status.forEach(stat => {
      let value = stat.Value;
      // 格式化各种值
      if (stat.Variable_name === 'Uptime') {
        const seconds = parseInt(value);
        const days = Math.floor(seconds / 86400);
        const hours = Math.floor((seconds % 86400) / 3600);
        const minutes = Math.floor((seconds % 3600) / 60);
        value = `${days}天 ${hours}小时 ${minutes}分钟`;
      } else if (stat.Variable_name === 'Bytes_received' || stat.Variable_name === 'Bytes_sent') {
        const bytes = parseInt(value);
        const mb = (bytes / 1024 / 1024).toFixed(2);
        value = `${mb} MB`;
      }
      console.log(`   - ${stat.Variable_name}: ${value}`);
    });
    console.log('');

    console.log('========================================');
    console.log('🎉 所有测试通过！数据库连接正常！');
    console.log('========================================');

    return true;

  } catch (error) {
    console.error('');
    console.error('========================================');
    console.error('❌ 数据库连接测试失败');
    console.error('========================================');
    console.error('');
    console.error('错误详情:');
    console.error(`   错误代码: ${error.code}`);
    console.error(`   错误消息: ${error.message}`);
    console.error(`   SQL 状态: ${error.sqlState || 'N/A'}`);
    if (error.sql) {
      console.error(`   SQL 语句: ${error.sql}`);
    }
    console.error('');

    // 错误诊断
    console.error('🔧 诊断建议:');
    switch (error.code) {
      case 'ECONNREFUSED':
        console.error('   ❌ 连接被拒绝');
        console.error('   → 数据库服务未启动或无法访问');
        console.error('   → 检查主机地址和端口是否正确');
        console.error('   → 检查防火墙设置');
        break;
      
      case 'ER_ACCESS_DENIED_ERROR':
        console.error('   ❌ 访问被拒绝 - 身份验证失败');
        console.error('');
        console.error('   可能的原因:');
        console.error('   1. 用户名或密码错误');
        console.error('   2. 用户没有权限访问该数据库');
        console.error('   3. IP地址限制 - 数据库只允许特定IP访问');
        console.error('');
        console.error('   当前尝试从以下位置连接:');
        const ipMatch = error.message.match(/'([^']+)'/g);
        if (ipMatch && ipMatch.length >= 2) {
          console.error(`   用户: ${ipMatch[0]}`);
          console.error(`   来源IP: ${ipMatch[1].replace(/'/g, '')}`);
        }
        console.error('');
        console.error('   解决方案:');
        console.error('   → 确认 .env 文件中的用户名和密码是否正确');
        console.error('   → 联系数据库管理员，确认用户权限设置');
        console.error('   → 检查数据库用户是否允许从当前IP地址访问');
        console.error('   → MySQL命令示例:');
        console.error('      GRANT ALL PRIVILEGES ON prompt.* TO \'prompt\'@\'%\' IDENTIFIED BY \'password\';');
        console.error('      FLUSH PRIVILEGES;');
        break;
      
      case 'ER_BAD_DB_ERROR':
        console.error('   ❌ 数据库不存在');
        console.error('   → 数据库名称可能拼写错误');
        console.error('   → 需要先创建数据库');
        console.error('   → 检查 .env 文件中的 DB_DATABASE 配置');
        break;
      
      case 'ETIMEDOUT':
        console.error('   ❌ 连接超时');
        console.error('   → 网络连接问题');
        console.error('   → 数据库服务器可能不可达');
        console.error('   → 防火墙可能阻止了连接');
        break;
      
      case 'ENOTFOUND':
        console.error('   ❌ 主机未找到');
        console.error('   → 主机地址错误或DNS解析失败');
        console.error('   → 检查 .env 文件中的 DB_HOST 配置');
        break;
      
      default:
        console.error('   → 检查 .env 文件中的数据库配置');
        console.error('   → 查看完整错误信息');
        console.error('   → 尝试使用数据库客户端工具直接连接测试');
    }
    console.error('');
    
    return false;

  } finally {
    // 关闭连接
    if (connection) {
      await connection.end();
      console.log('🔌 数据库连接已关闭\n');
    }
  }
}

// 执行测试
console.log('');
testConnection().then(success => {
  process.exit(success ? 0 : 1);
}).catch(error => {
  console.error('未捕获的错误:', error);
  process.exit(1);
});

